package sanrenxing.dayEnd.backRepertoryTotal.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import sanrenxing.dayEnd.backRepertoryTotal.domain.*;
import sanrenxing.dayEnd.backRepertoryTotal.service.*;
import sanrenxing.dayEnd.backRepertoryTotal.utils.sdf;

import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 功能:ta交易结算控制器类
 * 编写者：赵思睿
 * 日期：2021
 * 版本：1.0
 */
@RestController
@RequestMapping("/TATrabsaction")
public class TATrabsactionController {
    //定义Ta交易结算业务层接口
    @Autowired
    private TATrabsactionBiz taTrabsactionBiz;
    //定义资金调拨业务层接口
    @Autowired
    private FundAllocationBiz fundAllocationBiz;
    //定义现金应收应付库存业务层接口
    @Autowired
    private CashRecAndPayStockBiz crapBiz;
    //定义现金应收应付业务层接口
    @Autowired
    private MoneyitiesService moneyitiesService;
    //注入时间对象
    @Autowired
    private sdf dateUilts;

    /**
     * 显示页面
     * @param req 请求对象
     * @param page 页数
     * @param limit 每页行数
     * @return 映射对象集合
     * @throws ParseException 语法异常
     */
    @GetMapping("/TAT")
    public Map<String, Object> addTAT(HttpServletRequest req, int page, int limit) throws ParseException {
        /*定义用于多条件查询的TA交易处理对象*/
        TATrabsactionSettlement taTrabsactionSettlement=new TATrabsactionSettlement();
        /*接收来自请求中的ta交易类型*/
        String tranType=req.getParameter("tranType");
        //判断ta交易类型
        if(tranType!=null && tranType.trim().length()!=0){
            //添加到ta交易结算对象中
            taTrabsactionSettlement.setTranType(Integer.parseInt(tranType));
        }
        /*接收来自请求中的状态*/
        String tranStatus=req.getParameter("tranStatus");
        //判断ta交易状态
        if(tranStatus!=null && tranStatus.trim().length()!=0){
            //添加到ta交易结算对象中
            taTrabsactionSettlement.setTranStatus(Integer.parseInt(tranStatus));
        }

        /*调用业务层获取查询条件方法*/
        String condition=taTrabsactionBiz.getCount(taTrabsactionSettlement);
        /*执行多条件分页查询的方法*/
        List<TATrabsactionSettlementTwo> TATList=taTrabsactionBiz.findByPages(limit,page,condition);
        //在基金设置的时候将成立基金产生的ta数据添加到ta交易数据当中
        TATrabsactionSettlementTwo fundSetupData = taTrabsactionBiz.fundSetupData();
        //假设成立基金时有ta交易数据参数，则进行如下操作
        if (fundSetupData!=null){
            //定义一个最大数据
            int max=1;
            //循环遍历ta交易数据
            for (TATrabsactionSettlementTwo settlementTwo : TATList) {
                /*
                * 判断max是否小于ta交易编号dataId
                * true：dataId;
                * false:max
                */
                max=max<settlementTwo.getDataId()?settlementTwo.getDataId():max;
            }
            //修改基金所产生ta数据的ta交易编号dataId
            fundSetupData.setDataId(max+1);
            //遍历将两个数据合并在一起
            //判断TATList的size
            if (TATList.size()==0) {//如果size=0
                //定义一个TATList集合对象
                TATList=new ArrayList<>();
                //将基金成立数据添加到TA交易结算集合中
                TATList.add(fundSetupData);
            }else TATList.add(fundSetupData);
        }
        /*条件记录总行数*/
        int totalRows=taTrabsactionBiz.count(condition);

        /*定义映射集合对象*/
        Map<String,Object> map=new HashMap<>();
        //在映射集合中添加状态码
        map.put("code",0);
        //在映射集合中添加响应信息字符串
        map.put("msg","");
        //在映射集合中添加ta交易结算数据集合对象
        map.put("data",TATList);
        //在映射集合中添加总行数的数据对
        map.put("count",totalRows);
        //返回映射对象集合
        return map;
    }

    /**
     * 根据ta交易编号删除数据
     * @param dataId ta交易编号
     * @return delete success：删除成功；delete failure：删除失败
     */
    @DeleteMapping("/TAT/{dataId}")
    public String delete(@PathVariable int dataId){
        //定义一个影响行数
        int rows=0;
        //调用ta交易结算业务层的删除方法
        rows=taTrabsactionBiz.delete(dataId);
        //判断影响行数，如果影响行数大于0
        if(rows>0){
            //返回删除成功
            return "delete success";
        }else{
            //返回删除失败
            return "delete failure";
        }
    }

    /**
     * 进行ta交易结算
     * @param dataId ta交易编号
     * @return account success：结算成功
     */
    @Transactional
    @PostMapping("/allocation/{dataId}")
    public String account(@PathVariable String dataId){
        //判断Ta结算数据编号字符串dataId是否含有逗号
        if (dataId.contains(",")) {
            //对Ta结算数据编号字符串按","进行分割
            String[] strs = dataId.split(",");
            //循环查询
            for (String str : strs) {
                //调用ta交易结算业务层查询所有ta交易结算数据
                TATrabsactionSettlement ta=taTrabsactionBiz.findById(Integer.parseInt(str));
                //判断ta没有查询到，则是基金成立的ta交易数据
                if (ta==null){
                    //调用业务层查询基金的ta交易数据
                   TATrabsactionSettlement setup=taTrabsactionBiz.addFundSetup();
                    //定义资金调拨对象
                   FundAllocation fundAllocation=new FundAllocation();
                    //定义现金应收应付库存对象
                    CashRecAndPayStock crap=new CashRecAndPayStock();

                    //判断ta交易结算状态，如果ta交易结算状态为未结算-1
                    if(setup.getTranStatus()==-1){
                        //设置资金调拨的基金编号
                        fundAllocation.setFundId(setup.getFundId());
                        //设置资金调拨的现金账户编号
                        fundAllocation.setCaId(setup.getCaId());
                        //根据ta交易方式，判断资金调拨的流向
                        //ta交易方式为赎回3
                        if(setup.getTranType()==3){
                            //设置资金调拨方向为流出-1
                            fundAllocation.setDial(-1);
                        }else{
                            //设置资金调拨方向为流入1
                            fundAllocation.setDial(1);
                        }
                        //设置资金调拨的调拨金额
                        fundAllocation.setReMoney(setup.getSumMoney());
                        //设置资金调拨的业务日期
                        fundAllocation.setBusinDate(setup.getEndDate());
                        //在ta交易数据中 1认购 2申购 3赎回
                        //判断ta交易数据的交易方式
                        switch(setup.getTranType()){
                            case 1:
                                //设置资金调拨的调拨类型为认购款
                                fundAllocation.setReType("认购款");
                                //设置资金调拨的调拨日期
                                fundAllocation.setReDate(setup.getEndDate());
                                break;
                            case 2:
                                //设置资金调拨的调拨类型为申购款
                                fundAllocation.setReType("申购款");
                                //设置资金调拨的调拨日期:申购需要t+1,所以调用时间对象，修改调拨日期为t+1,并且会跳过所有节假日
                                fundAllocation.setReDate(dateUilts.sdsDate(setup.getEndDate(),1));
                                break;
                            case 3:
                                //设置资金调拨的调拨类型为赎回款
                                fundAllocation.setReType("赎回款");
                                //设置资金调拨的调拨日期:赎回需要t+2,所以调用时间对象，修改调拨日期为t+2,并且会跳过所有节假日
                                fundAllocation.setReDate(dateUilts.sdsDate(setup.getEndDate(),2));
                                break;
                            case 4:
                                //设置资金调拨的调拨类型为基金成立
                                fundAllocation.setReType("基金成立");
                                //设置资金调拨的调拨日期
                                fundAllocation.setReDate(setup.getEndDate());
                        }

                        //设置资金调拨的标记为未处理
                        fundAllocation.setMark("未处理");
                        //调用资金调拨的业务层添加方法
                        fundAllocationBiz.add(fundAllocation);

                        //设置现金应收应付库存的现金账户编号
                        crap.setCaId(setup.getCaId());
                        //设置现金应收应付库存的基金编号
                        crap.setFundId(setup.getFundId());
                        //在ta交易数据中 1认购 2申购 3赎回
                        //判断ta交易数据的交易方式
                        //ta交易方式为认购1
                        if (setup.getTranType()==1){
                            //设置现金应收应付的业务类型为认购4
                            crap.setBusinType(String.valueOf(4));
                        }else if (setup.getTranType()==2){//ta交易方式为申购2
                            //设置现金应收应付的业务类型为申购5
                            crap.setBusinType(String.valueOf(5));
                        }else if (setup.getTranType()==3){//ta交易方式为赎回3
                            //设置现金应收应付的业务类型为赎回6
                            crap.setBusinType(String.valueOf(6));
                        }else if (setup.getTranType()==4){//ta交易方式为基金成立4
                            //设置现金应收应付的业务类型为基金成立7
                            crap.setBusinType(String.valueOf(7));
                        }
                        //设置现金应收应付库存的业务日期
                        crap.setDates(new SimpleDateFormat("yyyy-MM-dd").format(setup.getEndDate()));

                        //设置现金应收应付库存的数量
                        crap.setNumbers(setup.getNumbers());
                        //设置现金应收应付库存的总金额
                        crap.setSumMoney(setup.getSumMoney());
                        //根据Ta交易类型，如果Ta交易类型为认购1、申购2
                        if(setup.getTranType()==1 || setup.getTranType()==2){
                            //设置现金应收应付库存的业务状态为流入1
                            crap.setStatus(1);
                        }else{
                            //设置现金应收应付库存的业务状态为流出-1
                            crap.setStatus(-1);
                        }
                        //调用现金应收应付库存业务层的添加方法
                        crapBiz.add(crap);

                        //调用ta交易数据业务层的修改基金信息方法，将基金设置设置为已入库
                        taTrabsactionBiz.updateFundSetup();
                    }
                }else{
                    //定义资金调拨对象
                    FundAllocation fundAllocation=new FundAllocation();
                    //定义现金应收应付库存对象
                    CashRecAndPayStock crap=new CashRecAndPayStock();
                    //定义现金应收应付对象
                    CashReceivable cashReceivable=new CashReceivable();


                    //判断ta交易结算状态，如果ta交易结算状态为未结算-1
                    if(ta.getTranStatus()==-1){
                        //设置资金调拨的基金编号
                        fundAllocation.setFundId(ta.getFundId());
                        //设置资金调拨的现金账户编号
                        fundAllocation.setCaId(ta.getCaId());
                        //根据ta交易方式，判断资金调拨的流向
                        //ta交易方式为赎回3
                        if(ta.getTranType()==3){
                            //设置资金调拨方向为流出-1
                            fundAllocation.setDial(-1);
                        }else{
                            //设置资金调拨方向为流入1
                            fundAllocation.setDial(1);
                        }

                        //设置资金调拨的调拨金额
                        fundAllocation.setReMoney(ta.getActMoney());
                        //设置资金调拨的调拨日期
                        fundAllocation.setReDate(ta.getEndDate());
                        //设置资金调拨的业务日期
                        fundAllocation.setBusinDate(ta.getEndDate());
                        //判断ta交易方式
                        //在ta交易数据中 1认购 2申购 3赎回
                        switch(ta.getTranType()){
                            case 1:
                                //设置资金调拨的调拨类型为认购款
                                fundAllocation.setReType("认购款");
                                break;
                            case 2:
                                //设置资金调拨的调拨类型为申购款
                                fundAllocation.setReType("申购款");
                                //设置资金调拨的调拨日期:申购需要t+1,所以调用时间对象，修改调拨日期为t+1,并且会跳过所有节假日
                                fundAllocation.setReDate(dateUilts.sdsDate(ta.getEndDate(),1));
                                break;
                            case 3:
                                //设置资金调拨的调拨类型为赎回款
                                fundAllocation.setReType("赎回款");
                                //设置资金调拨的调拨日期:赎回需要t+2,所以调用时间对象，修改调拨日期为t+2,并且会跳过所有节假日
                                fundAllocation.setReDate(dateUilts.sdsDate(ta.getEndDate(),2));
                                break;
                        }

                        //设置资金调拨的标记为未处理
                        fundAllocation.setMark("未处理");
                        //调用资金调拨的业务层添加方法
                        fundAllocationBiz.add(fundAllocation);

                        //设置现金应收应付库存的现金账户编号
                        crap.setCaId(ta.getCaId());
                        //设置现金应收应付库存的基金编号
                        crap.setFundId(ta.getFundId());
                        //判断ta交易方式
                        //在ta交易数据中 1认购 2申购 3赎回
                        if (ta.getTranType()==1){
                            //设置现金应收应付的业务类型为认购4
                            crap.setBusinType(String.valueOf(4));
                        }else if (ta.getTranType()==2){
                            //设置现金应收应付的业务类型为申购5
                            crap.setBusinType(String.valueOf(5));
                        }else if (ta.getTranType()==3){
                            //设置现金应收应付的业务类型为赎回6
                            crap.setBusinType(String.valueOf(6));
                        }
                        //设置现金应收应付库存的业务日期
                        crap.setDates(new SimpleDateFormat("yyyy-MM-dd").format(ta.getEndDate()));
                        //设置现金应收应付库存的数量
                        crap.setNumbers(ta.getNumbers());
                        //设置现金应收应付库存的总金额
                        crap.setSumMoney(ta.getActMoney());
                        //根据Ta交易类型，如果Ta交易类型为认购1、申购2
                        if(ta.getTranType()==1 || ta.getTranType()==2){
                            //设置现金应收应付库存的业务状态为流入1
                            crap.setStatus(1);
                        }else{
                            //设置现金应收应付库存的业务状态为流出-1
                            crap.setStatus(-1);
                        }
                        //调用现金应收应付库存业务层的添加方法
                        crapBiz.add(crap);

                        //设置现金应收应付的业务日期
                        cashReceivable.setBusinDate(ta.getEndDate());
                        //设置现金应收应付的现金账户编号
                        cashReceivable.setCaId(ta.getCaId());
                        //设置现金应收应付的基金编号
                        cashReceivable.setFundId(ta.getFundId());
                        //设置现金应收应付的状态为0
                        cashReceivable.setStates(0);
                        //设置现金应收应付的金额
                        cashReceivable.setMoney(ta.getActMoney());
                        //根据Ta交易类型判断,如果为认购1
                        if(ta.getTranType()==1){
                            //设置现金应收应付的业务类型为认购款
                            cashReceivable.setBusinType("认购款");
                            //设置现金应收应付的资金流向为流入1
                            cashReceivable.setCapFlow(1);
                        }else if(ta.getTranType()==2){//根据Ta交易类型判断,如果为申购2
                            //设置现金应收应付的业务类型为申购款
                            cashReceivable.setBusinType("申购款");
                            //设置现金应收应付的资金流向为流入1
                            cashReceivable.setCapFlow(1);
                        }else if(ta.getTranType()==3){//根据Ta交易类型判断,如果为赎回3
                            //设置现金应收应付的业务类型为赎回款
                            cashReceivable.setBusinType("赎回款");
                            //设置现金应收应付的资金流向为流出-1
                            cashReceivable.setCapFlow(-1);
                        }
                        //调用现金应收应付的业务层添加方法
                        moneyitiesService.add(cashReceivable);

                        //将ta交易结算状态改为已结算1
                        ta.setTranStatus(1);
                        //调用ta交易结算业务层的修改方法
                        taTrabsactionBiz.update(ta);
                    }
                }
            }
        }
        //返回结算成功
        return "account success";
    }
}
